<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no">
    <meta http-equiv="X-UA-Compatible" content="ie=edge,chrome=1">
    <meta name="referrer" content="never">
    <title>作业</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        ul {
            list-style: none;
        }
    </style>
</head>
<body>
    
    <script type="text/javascript">
        // 数组扁平化 -> 去重 -> 升序排列
        var arr = [12,21,[35,43,43,[5,6],12,1,7],1,7,[8,12,35,2,4,1,9,[13,19]],2,4];

        function dealArr(array){
            var newArr = [];
            // 扁平
            !function flat(array){
                for(var i = 0; i < array.length; i ++){
                    // 判断当前项是否是数组，是-> 递归拍平
                    if(Array.isArray(array[i])){
                        flat(array[i]);
                    }else {
                        newArr.push(array[i]);
                    }
                }
            }(array);
            // 去重
            // 1. 声明新数组，判断旧数组项是否在新数组中存在，不存在添加
            // 2. 判断前后查询下标是否一致
            // 3. 对象属性法 -> 数字会变成字符串，排好序的 --》 查询数组某个内容出现次数
            for(var j = 0; j < newArr.length; j ++){
                if(j !== newArr.lastIndexOf(newArr[j])){
                    newArr.splice(j, 1);
                    j --;
                }
            }
            /* var obj = {}
            newArr.forEach(function (item){
                obj[item] = 0;
            })
            
            console.log(Object.keys(obj)); */

            // 升序排列
            newArr.sort(function (a, b){
                return a - b;                
            })

            return newArr;
        }

        console.log(dealArr(arr));

        // 实现延时执行函数的效果  函数装饰器
        function fn(str){
            console.log(str);
        }

        var f2000 = delay(fn, 2000);

        // f2000("hello");

        function delay(func, wait){
            return function (...args){
                setTimeout(function (){
                    func.apply(this, args);
                }, wait)
            }
        }

    </script>
</body>
</html>